package com.guochao.myRPCversion2.client;

import com.guochao.myRPCversion2.common.RPCRequest;
import com.guochao.myRPCversion2.common.RPCResponse;
import lombok.AllArgsConstructor;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


// 传入参数Service接口的class对象，反射封装成一个request
@AllArgsConstructor
public class ClientProxy implements InvocationHandler { //代理设计模式（动态代理）

    private String host;
    private int port;


    // jdk 动态代理， 每一次代理对象调用方法，会经过此方法增强
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        //反射获取RPCRequest中属性的具体类型，然后封装成一个RPCRequest对象。
        RPCRequest request = RPCRequest.builder().interfaceName(method.getDeclaringClass().getName())
                .methodName(method.getName())
                .params(args).paramsTypes(method.getParameterTypes()).build();
        //数据传输
        RPCResponse response = IOClient.sendRequest(host, port, request);
        //System.out.println(response);
        return response.getData();
    }

    <T>T getProxy(Class<T> clazz){//单例设计模式，通过Proxy代理类返回一个代理对象实例
        Object o = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, this);
        return (T)o;
    }
}
